package com.cpems.system.task;

import com.cpems.system.service.IDataProcessingService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * 数据处理定时任务
 * 用于定期从MySQL拉取数据进行处理，替代RabbitMQ的实时消息处理
 *
 * @author cpems
 * @date 2023-12-01
 */
@Slf4j
@RequiredArgsConstructor
@Component
public class DataProcessingTask {

    private final IDataProcessingService dataProcessingService;

    /**
     * 每分钟执行一次数据处理
     * 处理最近5分钟内的所有未处理数据
     */
    @Scheduled(fixedRate = 60000) // 每60秒执行一次
    public void processAllData() {
        try {
            log.debug("开始执行定时数据处理任务");
            dataProcessingService.processAllUnprocessedData();
            log.debug("定时数据处理任务执行完成");
        } catch (Exception e) {
            log.error("定时数据处理任务执行失败", e);
        }
    }

    /**
     * 每30秒执行一次电压数据处理（高频数据优先处理）
     */
    @Scheduled(fixedRate = 30000) // 每30秒执行一次
    public void processElectricityUData() {
        try {
            log.debug("开始执行电压数据处理任务");
            dataProcessingService.processUnprocessedElectricityU();
        } catch (Exception e) {
            log.error("电压数据处理任务执行失败", e);
        }
    }

    /**
     * 每30秒执行一次电流数据处理（高频数据优先处理）
     */
    @Scheduled(fixedRate = 30000) // 每30秒执行一次
    public void processElectricityIData() {
        try {
            log.debug("开始执行电流数据处理任务");
            dataProcessingService.processUnprocessedElectricityI();
        } catch (Exception e) {
            log.error("电流数据处理任务执行失败", e);
        }
    }

    /**
     * 每30秒执行一次电功率数据处理（高频数据优先处理）
     */
    @Scheduled(fixedRate = 30000) // 每30秒执行一次
    public void processElectricityPData() {
        try {
            log.debug("开始执行电功率数据处理任务");
            dataProcessingService.processUnprocessedElectricityP();
        } catch (Exception e) {
            log.error("电功率数据处理任务执行失败", e);
        }
    }

    /**
     * 每2分钟执行一次总用电量数据处理
     */
    @Scheduled(fixedRate = 120000) // 每120秒执行一次
    public void processElectricityWData() {
        try {
            log.debug("开始执行总用电量数据处理任务");
            dataProcessingService.processUnprocessedElectricityW();
        } catch (Exception e) {
            log.error("总用电量数据处理任务执行失败", e);
        }
    }

    /**
     * 每2分钟执行一次用水量数据处理
     */
    @Scheduled(fixedRate = 120000) // 每120秒执行一次
    public void processWaterConsumptionData() {
        try {
            log.debug("开始执行用水量数据处理任务");
            dataProcessingService.processUnprocessedWaterConsumption();
        } catch (Exception e) {
            log.error("用水量数据处理任务执行失败", e);
        }
    }

    /**
     * 每小时执行一次数据清理任务
     * 清理已处理的旧数据，避免重复处理
     */
    @Scheduled(fixedRate = 3600000) // 每小时执行一次
    public void cleanupProcessedData() {
        try {
            log.info("开始执行数据清理任务");
            // 这里可以添加清理逻辑，比如标记已处理的数据或删除过期数据
            // 暂时只记录日志
            log.info("数据清理任务执行完成");
        } catch (Exception e) {
            log.error("数据清理任务执行失败", e);
        }
    }
}